<?php 
namespace Common\Util;
use Think\Cache\Driver\Redis;
/**
 * 缓存工具类
 * @author liuyang
 * @version 2.0
 * @since 20160417
 */
class CacheUtils {
    
    private static  $PRI_PREFIX=null;
    const VERSION_PREFIX="version_";
    const TELPHONE_PREFIX="telphone_";
	const SHOPINFO_PREFIX = 'shopInfo_';//店铺信息
	const WELCOME_PREFIX = 'welcome_';//欢迎页图片
	const USER_TAG_VERSION="user_tag_update_version";
	const USER_DETAIL_UPDATE_VERSION="user_detail_update_version";
	const USER_RIGHT_ADD_VERSION="user_right_add_version";
	//项目评价推送
	const PROJECT_APP = "project_app_";
	const SYS_ERROR_MSG="system_error_msg";
	 
	   
	public static function get($name){
	     self::$PRI_PREFIX = ConfigUtils::getConfig("CACHE_PREFIX"); 
	    return S(self::$PRI_PREFIX.$name);
	}
	
	public static function set($name,$val,$expire){
	    self::$PRI_PREFIX = ConfigUtils::getConfig("CACHE_PREFIX");
	    return S(self::$PRI_PREFIX.$name,$val,$expire);
	}
	
	/**
	 * 加并发锁
	 * @param unknown $name
	 */
	public static function lock($lockKey,$lockExpire=10){
	    $redis = new Redis();
	    self::$PRI_PREFIX = ConfigUtils::getConfig("CACHE_PREFIX");   
	    $lockKey = self::$PRI_PREFIX.$lockKey;
	    //设置锁值为当前时间戳 + 有效期
	    $lockValue = time() + $lockExpire;
	    /**
	     * 创建锁
	     * 试图以$lockKey为key创建一个缓存,value值为当前时间戳
	     * 由于setnx()函数只有在不存在当前key的缓存时才会创建成功
	     * 所以，用此函数就可以判断当前执行的操作是否已经有其他进程在执行了
	     * @var [type]
	     */
	    $lock = $redis->setnx($lockKey, $lockValue); 
	    
	    /**
	     * 满足两个条件中的一个即可进行操作
	     * 1、上面一步创建锁成功;
	     * 2、   1）判断锁的值（时间戳）是否小于当前时间    $redis->get()
	     *      2）同时给锁设置新值成功    $redis->getset()
	    */
	    if(!empty($lock) || ($redis->get($lockKey) < time() && $redis->getSet($lockKey, $lockValue) < time() ))
	    {
	        //给锁设置生存时间
	        $redis->expire($lockKey, $lockExpire);
	        //******************************
	        //此处执行插入、更新缓存操作...
	        //******************************
	    
	        //以上程序走完删除锁
	        //检测锁是否过期，过期锁没必要删除
	        //if($redis->ttl($lockKey))
	          //  $redis->del($lockKey);
	       
	    }else{
	        exit();
	    }
	}
	 
 
	 
}
?>